import json

from django.conf.locale import hr
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render

# Create your views here.
from booktest.models import BookInfo

"""使用Django知识自定义RestAPI接口:（看路由而定几个类视图）
1. 获取所有图书的信息 GET /books/
2. 新增一本图书信息,  POST /books/

3. 获取指定的图书信息 GET /books/(?P<pk>\d+)/
4. 修改指定的图书信息 PUT /books/(?P<pk>\d+)/
5. 删除指定的图书信息 DELETE /books/(?P<pk>\d+)/
"""

# 使用类视图
# 定义一个图书列表类视图，继承Django提供的View类
from django.views import View

"""图书表类视图"""
"""GET /books/
   POST /books/"""


class BookListView(View):


    # 查询所有图书,用get请求方式
    def get(self,request):
        #思路
        # 将所有图书模型对象查询出来
        #遍历，将图书模型对象对应的属性封装成字典
        #用JsonResponse返回字典给前端
        try:
            queryset = BookInfo.objects.all()
        except BaseException as e:
            return HttpResponse('数据库查询出错')
        book_list = []
        #遍历得到的所有查询集，得到所有图书表的模型对象,并将其转换成字典（序列化）
        for book in queryset:
            book_list.append(
                {
                    'id':book.id,
                    'btitle':book.btitle,
                    'bpub_date':book.bpub_date,
                    'bread':book.bread,
                    'bcomment':book.bcomment,

                }
            )
        #返回json响应对象,如果返回的不是字典，要将safe = False 加上，
        # JsonResponse会自动将传入数据里的字典转成json数据
        return JsonResponse(book_list,safe=False)

    #新建一个图书模型对象，用post
    def post(self,request):
        #思路
        #用户要新建图书模型对象，那么一定要把参数，图书名和发布日期传给后端
        #因为post请求，所以用json传参
        #获取参数，用request.body 接收json数据
        #校验参数
        #因为收到的是json类型的数据，要将其转换成Python对象
        #根据参数创建图书模型对象，（存入数据库）
        #将新建的模型对象所有属性信息封装成字典
        #返回json和新建成功状态码201

        #用户要新建图书模型对象，那么一定要把参数，图书名和发布日期传给后端
        #因为post请求，所以用json传参
        #获取参数，用request.body 接收json数据
        json_bytes = request.body
        #校验参数
        if not json_bytes:
            return HttpResponse('参数错误')
        #因为收到的是json类型的数据，要将其转换成Python对象,是一个字典
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)
        #根据参数创建图书模型对象，（存入数据库）
        book = BookInfo.objects.create(
            btitle=book_dict.get('btitle'),
            bpub_date=book_dict.get('bpub_date')
        )
        #将新建的模型对象所有属性信息封装成字典
        data = {
            'id':book.id,
            'btitle':book.btitle,
            'bpub_date':book.bpub_date,
            'bread':book.bread,
            'bcomment':book.bcomment,
        }
        #返回json和新建成功状态码201,用json_dumps_params，解码，
        # 可以当包含的内容中包含中文时，会返回该中文对应的编码
        return JsonResponse(data,status=201,json_dumps_params={'ensure_ascii':False})

    #写完记得取urls文件注册类视图路由

"""指定某本图书表类视图"""
"""put /books/(?P<pk>\d+)
   DELETE /books/(?P<pk>\d+)"""

class BookDetailView(View):
    """修改指定图书用put请求，删除指定图书用delete请求"""


    #获取单个图书信息
    def get(self,request,pk):
        #思路
        # 获取到查询字符串中的图书id，pk是图书id,
        # 根据图书id查询出模型对象，
        # 将模型对象所有属性封装成字典
        # json返回前端

        #获取到查询字符串中的图书id，pk是图书id,
        #根据图书id查询出模型对象，
        book = BookInfo.objects.get(id=pk)
        #将模型对象所有属性封装成字典
        data = {
            'id': book.id,
            'btitle': book.btitle,
            'bpub_date': book.bpub_date,
            'bread': book.bread,
            'bcomment': book.bcomment,
        }
        #json返回前端，及修改成功状态码200,默认就是200，所有可以省略
        return JsonResponse(data,json_dumps_params={'ensure_ascii':False})




    #修改指定图书
    def put(self,request,pk):
        # 思路
        #根据传来的图书id，查询模型对象
        # 校验参数，如果传来的id不存在，要捕捉异常
        #修改的内容会通过json传给后端，所以还要获取参数
        # 因为收到的是json类型的数据，要将其转换成Python对象
        # 根据查询出来的图书模型对象，将用户修改的内容进行替换（存入数据库）
        # 将被修改的模型对象所有属性信息封装成字典
        # 返回json和新建成功状态码200，可省略

        #根据传来的图书id，查询模型对象
        # 校验参数，如果传来的id不存在，要捕捉异常
        try:
            book = BookInfo.objects.get(id=pk)
        except BaseException as e:
            return HttpResponse(status=404)
        #修改的内容会通过json传给后端，所以还要获取参数
        json_bytes = request.body
        # 因为收到的是json类型的数据，要将其转换成Python对象
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)
        if not book_dict:
            return HttpResponse('参数错误')
        # 根据查询出来的图书模型对象，将用户修改的内容进行替换（存入数据库）
        book.btitle = book_dict.get('btitle')
        book.bpub_date = book_dict.get('bpub_date')
        book.save()

        # 将被修改的模型对象所有属性信息封装成字典
        data = {
            'id': book.id,
            'btitle': book.btitle,
            'bpub_date': book.bpub_date,
            'bread': book.bread,
            'bcomment': book.bcomment,
        }
        # 返回json和新建成功状态码200，可省略
        return JsonResponse(data,json_dumps_params={'ensure_ascii':False})

    #删除模型对象
    def delete(self,request,pk):
        # 思路
        # 获取到查询字符串中的图书id，pk是图书id,
        # 根据图书id查询出模型对象，
        # 将模型对象删除
        # 返回前端一个空字符串及删除成功状态码204

        # 获取到查询字符串中的图书id，pk是图书id,
        # 根据图书id查询出模型对象，校验id是否存在捕捉异常
        try:
            book = BookInfo.objects.get(id=pk)
        except BaseException as e:
            return HttpResponse(status=404)
        # 将模型对象删除
        book.delete()
        # 前端一个空字符串及删除成功状态码204
        return HttpResponse('',status=204)


